with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

procedure Date is
   
   
   B : Boolean := False; -- is bissextile
   Day : Integer ;
   -- 31-30-29-28 days
   Month : Integer ;
   -- année bissssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssextile
   Year : Integer ;
   
   procedure DateSuivante(D : Integer ; Month : Integer ; Year : Integer ; B: boolean) is 
   begin
      D := D + 1 ;
      if Validate(B, Month, D) then 
	 Put("demain:");
	 Put(D);
	 Put("/");
	 Put(Month);
	 Put("/");
	 Put(Year);
      else
	 D := 01; 
	 M := M + 1 ;
	 if Validate(B, Month, D) then 
	    Put("demain:");
	    Put(D);
	    Put("/");
	    Put(Month);
	    Put("/");
	    Put(Year);
	 else 
	    D := 01; 
	    M := 01;
	    Year := Year + 1;
	 end if;
      end if ;
   end DateSuivante;
   
	 
	  
   function Validate(B: Boolean ; M: Integer ; D : Integer) return Boolean is
      -- var locale
      
   begin
      if B = True then -- bissextile 
	 if M = 1 or M=3 or M=5 or M=7 or M=8 or M=10 or M=12 then --31d
	    if D>0 and D<=31 then 
	       return True;
	    else 
	       return False;
	    end if;
	 else if M= 4 or M= 6 or M=9 or M= 11 then --30d
	    if D>0 and D<=30 then 
	       return True;
	    else 
	       return False;
	    end if;
	 else --february
	    if D>0 and D<=29 then 
	       return True;
	    else 
	       return False;
	    end if;
	 end if;
	 end if;
      Else  -- ! bissextile
	 if M = 1 or M=3 or M=5 or M=7 or M=8 or M=10 or M=12 then --31d
	    if D>0 and D<=31 then 
	       return True;
	    else 
	       return False;
	    end if;
	 else if  M= 4 or M= 6 or M=9 or M= 11 then --30 d
	    if D>0 and D<=30 then 
	       return True;
	    else 
	       return False;
	    end if;
	 else --february
	    if D>0 and D<=28 then 
	       return True;
	    else 
	       return False;
	    end if;
	 end if;
	 end if;
      end if;
   end Validate;

begin
   Put("day : ?");
   Get(Day);
   Put("month : ?");
   Get(Month);
   Put("year : ?");
   Get(Year);

   -- comparaisons
   if Year rem 400 = 0 then
      -- b 
      B := True ;
   else if Year rem 4 = 0 and not (Year rem 100 = 0) then 
      -- b
      B := True ;
   else
      B := False ;
      
   end if;
   end if;
   if Validate(B, Month, Day) = True then 
      Put_Line("Ok!");
   else 
      Put_Line("pas Ok!");
   end if;
   
   -- contrôle de date
   -- date suivante 
   DateSuivante(Day, Month, Year, B);
end Date; 
   
